package simpledb.storage;

/**
 * PageId 表示数据库中某张表的一个特定页面的唯一标识符。它是数据库管理系统中用于管理磁盘上数据页的重要抽象。
 * 每个 PageId 实例都包含两个关键信息：
 * 所属表的 ID（tableId）
 * 页面号（pageNumber），即该页面在文件中的位置编号
 * 这个接口主要用于：
 * 1、作为缓存池（BufferPool）中页面的唯一键
 * 2、在事务日志中记录操作的页面信息
 * 3、判断两个页面是否为同一个页面
 */
public interface PageId {

    /**
     * 将此 PageId 序列化为一组整数数组。
     * 通常用于日志记录或持久化存储。
     * 注意：实现类必须提供一个构造函数，参数数量与返回数组长度一致，
     * 以便可以通过 serialize() 得到的数据还原出原始 PageId 对象。
     *
     * @return 包含 tableId 和 pageNumber 的整型数组
     */
    int[] serialize();

    /**
     * 获取该页面所属的表的唯一标识符 tableId。
     *
     * @return 表的唯一ID
     */
    int getTableId();

    /**
     * 返回该 PageId 的哈希码。
     * 哈希码通常由 tableId 和 pageNumber 拼接计算而来。
     * 这个方法使得 PageId 可以作为 Hash 表的键使用（如 BufferPool 中的 pageToPageDataMap）。
     *
     * @return 当前 PageId 的哈希值
     */
    int hashCode();

    /**
     * 判断当前对象是否与另一个对象相等。
     * 用于比较两个 PageId 是否代表相同的页面（相同表 + 相同页号）。
     *
     * @param o 要比较的对象，必须是 PageId 类型
     * @return 如果两个 PageId 表示的是同一个页面，则返回 true
     */
    boolean equals(Object o);

    /**
     * 获取当前页面在其所属表文件中的页号。
     *
     * @return 页面号（从0开始计数）
     */
    int getPageNumber();
}
